package sam.msm.commons.util;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class DatetimeUtil {
	private static final String[] weeks = { "周日", "周一", "周二", "周三", "周四", "周五", "周六" };
	private static final Integer[] weekNumbers = { 0, 1, 2, 3, 4, 5, 6 };
	/** 带中划线日期时间格式yyyy-MM-dd HH:mm:ss */
	public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

	/**
	 * 获取当前时间是星期几
	 * @since 1.0
	 * @param dateTime
	 * @return <br>
	 *         <b>作者： @author 麻亮 <liang.ma@utsoft.cn></b> <br>
	 *         创建时间：2017年5月5日 上午1:15:09
	 */
	public static String getTimeOfWeek(Date dateTime) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(dateTime);
		int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
		if (w < 0)
			w = 0;
		return weeks[w];
	}
	public static int getTimeOfWeek(Long time) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date(time));
		int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
		if (w < 0)
			w = 0;
		return weekNumbers[w];
	}
	public static String parseDateToString(String parse, Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat(parse);
		String dateString = formatter.format(date);
		return dateString;
	}
	public static Date parseStringToDate(String parse, String dateString) {
		SimpleDateFormat formatter = new SimpleDateFormat(parse);
		Date date = new Date();
		try {
			date = formatter.parse(dateString);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
	public static Date addDate(Date wolftagdispeartime, long i) {
		long date = wolftagdispeartime.getTime();
		long result = date + i;
		return new Date(result);
	}
	public static boolean isSameDay(Date date1, Date date2) {
		Calendar cal1 = Calendar.getInstance();
		cal1.setTime(date1);
		Calendar cal2 = Calendar.getInstance();
		cal2.setTime(date2);
		boolean isSameYear = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR);
		boolean isSameMonth = isSameYear && cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH);
		boolean isSameDate = isSameMonth && cal1.get(Calendar.DAY_OF_MONTH) == cal2.get(Calendar.DAY_OF_MONTH);
		return isSameDate;
	}
	public static int getWeekNum(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		return cal.get(Calendar.WEEK_OF_YEAR);
	}
	public static int getMonthNum(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		return cal.get(Calendar.MONTH) + 1;
	}
	public static long getYearNum(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		return cal.get(Calendar.YEAR);
	}
	public static int between(Date date1, Date date2) {
		Calendar calst = Calendar.getInstance();
		;
		Calendar caled = Calendar.getInstance();
		calst.setTime(date1);
		caled.setTime(date2);
		// 设置时间为0时
		calst.set(Calendar.HOUR_OF_DAY, 0);
		calst.set(Calendar.MINUTE, 0);
		calst.set(Calendar.SECOND, 0);
		caled.set(Calendar.HOUR_OF_DAY, 0);
		caled.set(Calendar.MINUTE, 0);
		caled.set(Calendar.SECOND, 0);
		// 得到两个日期相差的天数
		int days = ((int) (caled.getTime().getTime() / 1000) - (int) (calst.getTime().getTime() / 1000)) / 3600 / 24;
		return days;
	}
	public static Date getZeroTimeCurDay() {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.MILLISECOND, 001);
		return cal.getTime();
	}
	/**
	 * 时间戳转换日期格式
	 * @param String
	 * @return date
	 */
	public static String stampToDate(String s) {
		String res;
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		long lt = new Long(s);
		Date date = new Date(lt);
		res = simpleDateFormat.format(date);
		return res;
	}
	/**
	 * 将时间转换为时间戳
	 * @param Date
	 * @return String
	 */
	public static String dateToStamp(Date date) throws ParseException {
		String res;
		long ts = date.getTime();
		res = String.valueOf(ts);
		return res;
	}
	/**
	 * 日期大小比较
	 * @param String date1
	 * @throws ParseException
	 */
	public static int compare_date(Date date1, Date date2) throws ParseException {
		if (date1.getTime() > date2.getTime()) {
			// date1 在date2前
			return 1;
		} else if (date1.getTime() < date2.getTime()) {
			// date1 在date2后
			return -1;
		} else {
			return 0;
		}
	}
	/**
	 * 获取当前Timestamp 时间
	 * @since 1.0
	 * @return <br>
	 *         <b>@author ZhangYang</b> <br>
	 *         创建时间：2015年8月7日 下午1:23:31
	 */
	public static Timestamp currentTimestemp() {
		Calendar c = Calendar.getInstance();
		return new Timestamp(c.getTimeInMillis());
	}
	/**
	 * 获取num天之前的日期
	 * @param num num
	 * @return string
	 */
	public static Date getBeforeDate(int num) {
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DATE, num);
		return cal.getTime();
	}
	/**
	 * 获取指定日期的num天之前的日期
	 * @param date
	 * @param num num
	 * @return string
	 */
	public static String getBeforeDayDate(Date date, int num) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DATE, num);
		return parseDate(cal.getTime());
	}
	/**
	 * 根据日期转成日期字符串(到天)
	 * @since 1.0
	 * @param date
	 * @return
	 * @author songxuan
	 * @date：2015年6月16日 上午10:51:08
	 */
	public static String parseDate(Date date) {
		return parse(date, DATE_TIME_FORMAT);
	}
	/**
	 * 根据日期对象转换成日期字符
	 * @param date date
	 * @param format String
	 * @return String
	 */
	public static String parse(Date date, String format) {
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		return sdf.format(date);
	}
	/**
	 * 获取当天起始时间
	 * @since 1.0
	 * @param date
	 * @return <br>
	 *         <b>作者： @author 吴刚 <gang.wu@utsoft.cn></b> <br>
	 *         创建时间：2017年6月6日 下午4:19:53
	 */
	public static Date getBeginOfDay(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		return calendar.getTime();
	}
	/**
	 * 获取当天结束时间
	 * @since 1.0
	 * @return <br>
	 *         <b>作者： @author 吴刚 <gang.wu@utsoft.cn></b> <br>
	 *         创建时间：2017年6月6日 下午4:21:36
	 */
	public static Date getEndOfDay(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.HOUR_OF_DAY, 23);
		calendar.set(Calendar.MINUTE, 59);
		calendar.set(Calendar.SECOND, 59);
		calendar.set(Calendar.MILLISECOND, 999);
		return calendar.getTime();
	}
	/**
	 * 获取一周前时间
	 * @since 1.0
	 * @param date
	 * @return <br>
	 *         <b>作者： @author 吴刚 <gang.wu@utsoft.cn></b> <br>
	 *         创建时间：2017年6月6日 下午4:19:53
	 */
	public static Date getWeekAgo(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DATE, -7);
		return calendar.getTime();
	}
	/**
	 * 获取一个月前的时间
	 * @since 1.0
	 * @return <br>
	 *         <b>作者： @author 吴刚 <gang.wu@utsoft.cn></b> <br>
	 *         创建时间：2017年6月6日 下午4:21:36
	 */
	public static Date getMonthAgo(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.MONTH, -1);
		return calendar.getTime();
	}
	public static Date addDay(Date date, int day) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DAY_OF_YEAR, day);
		return calendar.getTime();
	}
	/**
	 * 获取日期最开始的时间 1970-1-1
	 * @since 1.0
	 * @return <br>
	 *         <b>作者： @author 吴刚 <gang.wu@utsoft.cn></b> <br>
	 *         创建时间：2017年6月6日 下午4:21:36
	 */
	public static Date getBeginDateOfCalendar() {
		Calendar calendar = Calendar.getInstance();
		calendar.clear();
		return calendar.getTime();
	}
	/**
	 * @date: 最后一次修改时间:2017年6月14日 下午1:41:43
	 * @Package: com.u5km.utils
	 * @Title: getYesterdayTime
	 * @Description: 描述：获取昨天的时间
	 * @author: you-lin.wang@utsoft.cn
	 * @return
	 * @return: String
	 */
	public static Date getYesterdayTime() {
		Date date = new Date();// 取时间
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.DATE, -1);// 把日期往后增加一天.整数往后推,负数往前移动
		date = calendar.getTime();
		return date;
	}
	/**
	 * @date: 最后一次修改时间:2017年6月14日 下午1:41:43
	 * @Package: com.u5km.utils
	 * @Title: getYesterdayTime
	 * @Description: 描述：获取昨天的时间
	 * @author: you-lin.wang@utsoft.cn
	 * @return
	 * @return: String
	 */
	public static Date getAgoTime(int i) {
		Date date = new Date();// 取时间
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.DATE, -i);// 把日期往后增加一天.整数往后推,负数往前移动
		date = calendar.getTime();
		return date;
	}
	public static Date getAfterTime(int i) {
		Date date = new Date();// 取时间
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.DATE, +i);// 把日期往后增加一天.整数往后推,负数往前移动
		date = calendar.getTime();
		return date;
	}
}
